From c152fbf70f472c78a8849c413d8d4f3df16290f0 Mon Sep 17 00:00:00 2001 From: robertlipe Date: Fri, 23 Aug 2013 17:23:31 +0000 Subject: [PATCH] Florian Unger adds rptname, rptdigit options to tranform filter. git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4560 f51c46e8-681c-474f-0cfe-069cfd0219fb --- gpsbabel/defs.h | 2 + gpsbabel/reference/transform-names.gpx | 43 +++++++++++++++++++ gpsbabel/route.cc | 32 ++++++++++---- gpsbabel/testo.d/transform.test | 3 ++ gpsbabel/transform.cc | 39 ++++++++++++++--- .../formats/options/transform-rptdigits.xml | 13 ++++++ .../formats/options/transform-rptname.xml | 12 ++++++ 7 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 gpsbabel/reference/transform-names.gpx create mode 100644 gpsbabel/xmldoc/formats/options/transform-rptdigits.xml create mode 100644 gpsbabel/xmldoc/formats/options/transform-rptname.xml diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index 80f2f1a4c..8609bf699 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -718,8 +718,10 @@ geocache_container gs_mkcont(const char* t); route_head* route_head_alloc(void); void route_add(waypoint*); void route_add_wpt(route_head* rte, waypoint* wpt); +void route_add_wpt_named(route_head* rte, waypoint* wpt, const char* namepart, int number_digits); void route_del_wpt(route_head* rte, waypoint* wpt); void track_add_wpt(route_head* rte, waypoint* wpt); +void track_add_wpt_named(route_head* rte, waypoint* wpt, const char* namepart, int number_digits); void track_del_wpt(route_head* rte, waypoint* wpt); void route_add_head(route_head* rte); void route_del_head(route_head* rte); diff --git a/gpsbabel/reference/transform-names.gpx b/gpsbabel/reference/transform-names.gpx new file mode 100644 index 000000000..be40ab905 --- /dev/null +++ b/gpsbabel/reference/transform-names.gpx @@ -0,0 +1,43 @@ + + + + + + + + + 152.000000 + + RPT01 + 2.000000 + + + + + 138.300000 + + RPT02 + 3.000000 + + + + Name Track + Generated from track Name Track + + 152.000000 + + Name Track03 + 2.000000 + + + + Name Track #2 + Generated from track Name Track #2 + + 138.300000 + + Name Track #204 + 3.000000 + + + diff --git a/gpsbabel/route.cc b/gpsbabel/route.cc index 1afb5d9e4..8a9e24714 100644 --- a/gpsbabel/route.cc +++ b/gpsbabel/route.cc @@ -170,7 +170,7 @@ route_find_track_by_name(const char* name) } static void -any_route_add_wpt(route_head* rte, waypoint* wpt, int* ct, int synth) +any_route_add_wpt(route_head* rte, waypoint* wpt, int* ct, int synth, const char* namepart, int number_digits) { ENQUEUE_TAIL(&rte->waypoint_list, &wpt->Q); rte->rte_waypt_ct++; /* waypoints in this route */ @@ -178,16 +178,14 @@ any_route_add_wpt(route_head* rte, waypoint* wpt, int* ct, int synth) (*ct)++; } if (synth && !wpt->shortname) { - char tmpnam[10]; - snprintf(tmpnam, sizeof(tmpnam), "RPT%03d",*ct); - wpt->shortname = xstrdup(tmpnam); + xasprintf(&wpt->shortname,"%s%0*d", namepart, number_digits, *ct); wpt->wpt_flags.shortname_is_synthetic = 1; } update_common_traits(wpt); } void -route_add_wpt(route_head* rte, waypoint* wpt) +route_add_wpt_named(route_head* rte, waypoint* wpt, const char* namepart, int number_digits) { // First point in a route is always a new segment. // This improves compatibility when reading from @@ -196,11 +194,18 @@ route_add_wpt(route_head* rte, waypoint* wpt) wpt->wpt_flags.new_trkseg = 1; } - any_route_add_wpt(rte, wpt, &rte_waypts, 1); + any_route_add_wpt(rte, wpt, &rte_waypts, 1, namepart, number_digits); } void -track_add_wpt(route_head* rte, waypoint* wpt) +route_add_wpt(route_head* rte, waypoint* wpt) +{ + const char RPT[] = "RPT"; + route_add_wpt_named(rte, wpt, RPT, 3); +} + +void +track_add_wpt_named(route_head* rte, waypoint* wpt, const char* namepart, int number_digits) { // First point in a track is always a new segment. // This improves compatibility when reading from @@ -209,7 +214,14 @@ track_add_wpt(route_head* rte, waypoint* wpt) wpt->wpt_flags.new_trkseg = 1; } - any_route_add_wpt(rte, wpt, &trk_waypts, 0); + any_route_add_wpt(rte, wpt, &trk_waypts, 0, namepart, number_digits); +} + +void +track_add_wpt(route_head* rte, waypoint* wpt) +{ + const char RPT[] = "RPT"; + track_add_wpt_named(rte, wpt, RPT, 3); } waypoint* @@ -401,6 +413,8 @@ route_copy(int* dst_count, int* dst_wpt_count, queue** dst, queue* src) *dst_count = 0; *dst_wpt_count = 0; } + + const char RPT[] = "RPT"; QUEUE_FOR_EACH(src, elem, tmp) { route_head* rte_old = (route_head*)elem; @@ -412,7 +426,7 @@ route_copy(int* dst_count, int* dst_wpt_count, queue** dst, queue* src) rte_new->rte_num = rte_old->rte_num; any_route_add_head(rte_new, *dst); QUEUE_FOR_EACH(&rte_old->waypoint_list, elem2, tmp2) { - any_route_add_wpt(rte_new, waypt_dupe((waypoint*)elem2), dst_wpt_count, 0); + any_route_add_wpt(rte_new, waypt_dupe((waypoint*)elem2), dst_wpt_count, 0, RPT, 3); } (*dst_count)++; } diff --git a/gpsbabel/testo.d/transform.test b/gpsbabel/testo.d/transform.test index 77b886981..59f3f6ccb 100644 --- a/gpsbabel/testo.d/transform.test +++ b/gpsbabel/testo.d/transform.test @@ -9,3 +9,6 @@ rm -f ${TMPDIR}/transform-wpt.gpx gpsbabel -i gpx -f ${REFERENCE}/expertgps.gpx -x nuketypes,waypoints,tracks -x transform,wpt=rte,del=y -o gpx,gpxver=1.1 -F ${TMPDIR}/transform-wpt.gpx compare ${REFERENCE}/transform-wpt.gpx ${TMPDIR}/transform-wpt.gpx +rm -f ${TMPDIR}/transform-names.gpx +gpsbabel -t -i gpx -f ${REFERENCE}/track/seg2trk_test-seg.gpx -x nuketypes,routes,waypoints -x transform,rte=trk,del=y,rptname=y,rptdigits=2 -o gpx,gpxver=1.1 -F ${TMPDIR}/transform-names.gpx +compare ${REFERENCE}/transform-names.gpx ${TMPDIR}/transform-names.gpx diff --git a/gpsbabel/transform.cc b/gpsbabel/transform.cc index 46bc0f329..8167f5227 100644 --- a/gpsbabel/transform.cc +++ b/gpsbabel/transform.cc @@ -33,7 +33,13 @@ static char current_target; static route_head* current_trk; static route_head* current_rte; -static char* opt_routes, *opt_tracks, *opt_waypts, *opt_delete; +static char* opt_routes, *opt_tracks, *opt_waypts, *opt_delete, *rpt_name_digits, *opt_rpt_name; + +static char* current_namepart; + +static int name_digits, use_src_name; + +static char RPT[] = "RPT"; static arglist_t transform_args[] = { @@ -49,6 +55,14 @@ arglist_t transform_args[] = { "trk", &opt_tracks, "Transform waypoint(s) or route(s) into tracks(s) [W/R]", NULL, ARGTYPE_STRING, ARG_NOMINMAX }, + { + "rptdigits", &rpt_name_digits, "Number of digits in generated names", NULL, + ARGTYPE_INT, "2", NULL + }, + { + "rptname", &opt_rpt_name, "Use source name for route point names", "N", + ARGTYPE_BOOL, ARG_NOMINMAX + }, { "del", &opt_delete, "Delete source data after transformation", "N", ARGTYPE_BOOL, ARG_NOMINMAX @@ -81,10 +95,10 @@ transform_waypoints(void) wpt = waypt_dupe(wpt); switch (current_target) { case 'R': - route_add_wpt(rte, wpt); + route_add_wpt_named(rte, wpt, RPT, name_digits); break; case 'T': - track_add_wpt(rte, wpt); + track_add_wpt_named(rte, wpt, RPT, name_digits); break; } } @@ -93,6 +107,10 @@ transform_waypoints(void) static void transform_rte_disp_hdr_cb(const route_head* rte) { + current_namepart = RPT; + if (rte->rte_name && *rte->rte_name && use_src_name) { + current_namepart = rte->rte_name; + } if (current_target == 'T') { current_trk = route_head_alloc(); track_add_head(current_trk); @@ -106,6 +124,10 @@ transform_rte_disp_hdr_cb(const route_head* rte) static void transform_trk_disp_hdr_cb(const route_head* trk) { + current_namepart = RPT; + if (trk->rte_name && *trk->rte_name && use_src_name) { + current_namepart = trk->rte_name; + } if (current_target == 'R') { current_rte = route_head_alloc(); route_add_head(current_rte); @@ -121,9 +143,9 @@ transform_any_disp_wpt_cb(const waypoint* wpt) { waypoint* temp = waypt_dupe(wpt); if (current_target == 'R') { - route_add_wpt(current_rte, temp); + route_add_wpt_named(current_rte, temp, current_namepart, name_digits); } else if (current_target == 'T') { - track_add_wpt(current_trk, temp); + track_add_wpt_named(current_trk, temp, current_namepart, name_digits); } else { waypt_add(temp); } @@ -160,6 +182,13 @@ transform_process(void) { int delete_after = (opt_delete && (*opt_delete == '1')) ? 1 : 0; + use_src_name = (opt_rpt_name && (*opt_rpt_name == '1')) ? 1 : 0; + + name_digits = 3; + if (rpt_name_digits && *rpt_name_digits) { + name_digits = atoi(rpt_name_digits); + } + if (opt_waypts != NULL) { current_target = 'W'; switch (toupper(*opt_waypts)) { diff --git a/gpsbabel/xmldoc/formats/options/transform-rptdigits.xml b/gpsbabel/xmldoc/formats/options/transform-rptdigits.xml new file mode 100644 index 000000000..b810e9a4f --- /dev/null +++ b/gpsbabel/xmldoc/formats/options/transform-rptdigits.xml @@ -0,0 +1,13 @@ + +This option lets you configure how many digits GPSBabel uses for numbering generated route point names. + + +When GPSBabel creates route points during the transformation process these points are sequentially numbered and named "RPTxxx" where xxx represent the number. By default GPSBabel uses 3 digits for these numbers. Rationale: This way a large number of route points can be uniquely named while the generated names are limited to 6 characters. This limitation is imposed by specific GPS devices. + + +Using this option GPSBabel can be configured to use less or more digits for the generated names. This option is best used in conjunction with the rptname option. + + +Convert a GPX track to a GPX route, deleting the original track, using 2 digits for the generated numbers. +gpsbabel -i gpx -f track.gpx -x transform,wpt=trk,del,rptdigits=2 -o gpx -F route.gpx + diff --git a/gpsbabel/xmldoc/formats/options/transform-rptname.xml b/gpsbabel/xmldoc/formats/options/transform-rptname.xml new file mode 100644 index 000000000..39a1c2fce --- /dev/null +++ b/gpsbabel/xmldoc/formats/options/transform-rptname.xml @@ -0,0 +1,12 @@ + +With this option you can decide to let GPSBabel name generated route points according to their source track name. + + +GPSBabel creates route points during the transformation process named "RPTxxx" where xxx is a numeric part. + +Using this option GPSBabel can be configured to replace the "RPT" part of the generated names by the name of the source track during the transformation process. This is especially usefull if several differently named tracks are contained in the source file which should each be transformed into routes. + + +Convert a GPX track to a GPX route, deleting the original track, naming the generated points like the original track name. +gpsbabel -i gpx -f track.gpx -x transform,wpt=trk,del,rptname=y -o gpx -F route.gpx + -- 2.30.2